Write code that enhances all arrays such that you can call the array.groupBy(fn)
method on any array and it will return a grouped version of the array.
A grouped array is an object where each key is the output of fn(arr[i])
and each value is an array containing all items in the original array with that key.
The provided callback fn
will accept an item in the array and return a string key.
The order of each value list should be the order the items appear in the array. Any order of keys is acceptable.
Please solve it without lodash's _.groupBy
function.
編寫代碼以擴充所有陣列通用屬性或方法,以便可以在任何陣列上呼叫函數array.groupBy(fn)
,並且回傳該陣列的分組版本。
分組陣列是一個 每個鍵都是fn(arr[i])
的輸出,且每個值都是一個陣列,其中包含原始陣列中具有該鍵的所有項目。
以陣列中元素作為參數呼叫回調函數fn
將回傳一個字串作為鍵(string key)。
分組陣列中的值列表順序應該是項目在陣列中出現的順序,而鍵任何排序都是可接受的。
請在沒有 lodash 的 _.groupBy
函數的情況下解決它。
思路 -跑for迴圈檢查分組存不存在相同的鍵
擴充陣列方法“array.groupBy(fn)”,並且它將返回數組的分組版本,
分組數組是一個對象,其中每個鍵都是“fn(arr[i])”的輸出,每個值都是一個包含原始數組中具有該鍵的所有項目的數組。
Array.prototype.groupBy = function(fn) {
const grouped = {};
//分組邏輯
return grouped
};
試想一下
grouped應該具有鍵值對,根據 fn(element)的返回結果作為Key,而value則為element
Input:
array = [{"id":"1"},{"id":"1"},{"id":"2"}],
fn = function (item) { return item.id; }
Output:
{
"1": [{"id": "1"}, {"id": "1"}],
"2": [{"id": "2"}]
}
分組邏輯:使用迴圈遍歷原始陣列的元素,
確認返回物件中 fn(element)的鍵是否存在,如果不存在則grouped[key]賦值為空陣列[]
把原始陣列元素push到對應的grouped[key]內,完成分組。
array = [{"id":"1"},{"id":"1"},{"id":"2"}],
fn = function (item) { return item.id; }
Array.prototype.groupBy = function(fn) {
const grouped = {};
/* 分組邏輯
* object[key] 訪問屬性,如果不存在則grouped[key]賦值為空陣列[]
* 接著把原始陣列元素push到對應的grouped[key]內
* 舉例
* key = fn({"id":"1"}) = 1
* grouped[1]不存在的話 {"1":[]}
* grouped[1].push(e) {"1":[{"id":"1"},...]}
*/
for(let e of this){
const key = fn(e);
grouped[key] || (grouped[key] = []);
//於 if (!grouped[key]) { grouped[key] = [];}
grouped[key].push(e);
}
return grouped
};
let array1 = [
{"id":"1"},
{"id":"1"},
{"id":"2"}
];
let fn1 = function (item) {
return item.id;
}
const result1 = array1.groupBy(fn1);
console.log(JSON.stringify(result1));
//Output
// {"1":[{"id":"1"},{"id":"1"}],"2":[{"id":"2"}]}
let array2 = [
[1, 2, 3],
[1, 3, 5],
[1, 5, 9]
];
let fn2 = function (list) {
return String(list[0]);
}
const result2 = array2.groupBy(fn2);
console.log(JSON.stringify(result2));
//Output
// {"1":[[1,2,3],[1,3,5],[1,5,9]]}
let array3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let fn3 = function (n) {
return String(n > 5);
}
const result3 = array3.groupBy(fn3);
console.log(JSON.stringify(result3));
//Output
// {"false":[1,2,3,4,5],"true":[6,7,8,9,10]}